package com.spring.schooltest.scheduling;

public class CPU {
    // CPU一个时间片时长
    public Integer timeSlice = 20;

    // 记录每个进程进入时间，每当运行一个进程，该变量需要增加
    public static Integer processArriveTime = 0;

    public MyProcess run(MyProcess t) {
        // 设置进程进入CPU的时间
        t.setArriveTime(processArriveTime);

        // 设置进程开始运行时间
        t.setBeginTime(processArriveTime);

        // 获得该进程需要运行的时间
        int serveTime = t.getServeTime();

        // 把该进程需要运行的时间与CPU时间片相比较
        if (serveTime <= timeSlice) {
            // 若运行时间小于等于时间片
            // 那么该进程直接完成任务，记录进程进入时间的变量增加
            t.setEndTime(processArriveTime + serveTime);
            processArriveTime += serveTime;

            // 设置进程的周转时间: 已经运行了多久
            t.setRoundTime(serveTime);

            // 设置任务结束的进程对象需要的运行时间为0
            t.setServeTime(0);

            // 打印该进程任务完成情况
            System.out.println("[ CPU时间片大小: " + timeSlice + " ]; "
                    + "进程名为: " + t.getName() + "; "
                    + "进程进入CPU时间为: " + t.getArriveTime() + "; "
                    + "进程需要运行的时间为: " + serveTime + "; "
                    + "进程结束时间为: " + t.getEndTime());
        }else {
            // 如果运行时间大于时间片
            // 则把要运行任务的进程初始需要的运行时间减去CPU单个时间片时间
            // 该进程剩余运行时间
            int serveTimeResidue = serveTime - timeSlice;

            // 设置单个时间片内运行结束的进程，还需要的运行时间
            t.setServeTime(serveTimeResidue);

            // 进程优先级减1
            t.setPriority(t.getPriority() - 1);

            // 记录进程的进入时间的变量增加
            // 因为一个时间片该进程运行不完，所以是 += timeSlice
            processArriveTime += timeSlice;
            System.out.println("[ CPU时间片大小: " + timeSlice + " ]; "
                    + "进程名为: " + t.getName() + "; "
                    + "进程进入CPU时间为: " + t.getArriveTime() + "; "
                    + "进程需要额外的运行的时间为: " + serveTimeResidue + "; "
                    + "进程优先级降1;");
        }
        return t;
    }
}
